Week 8A
Geospatial Data: Street Networks

Show Code
# The usual imports
import altair as alt
import geopandas as gpd
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
Show Code
# Show all columns in dataframes
pd.options.display.max_columns = 999

# Hide warnings due to issue in shapely package 
# See: https://github.com/shapely/shapely/issues/1345
np.seterr(invalid="ignore")
{'divide': 'warn', 'over': 'warn', 'under': 'ignore', 'invalid': 'warn'}

1 Today: Urban street networks and OpenStreetMap (OSM)

  • Two tools that make working with OSM data very easy
  • What kind of questions can we answer?
    • Street orientations
    • Mapping event points to streets: car crashes
    • Mapping amenities
    • Network-constrained distances: accessibility

2 OSM: what is it?

  • Collaborative mapping
  • A free editable map of the World
  • Sort of like Wikipedia for maps

Great source of data: street networks and a wealth of amenity information

https://www.openstreetmap.org

3 Working with OSM data

  • Raw data is very messy
  • Two relatively new, amazing Python packages greatly simply the process
  • Related, but complementary features
    • OSMnx: downloading and manipulating streets as networks
    • Pandana: networks focused on accessibility of amenities

Related: interactive web maps in Python

4 Part 1: OSMnx

Relatively new package (just a few years old), but quickly becoming the go to package for working with street networks and OpenStreetMap data in Python.

Several key features:

Show Code
# !pip install osmnx
Show Code
import osmnx as ox

4.1 1.1. Getting boundary shapefiles from OSM

Key function: geocode_to_gdf() (docs)

We can get the boundary for anything identified as a “place” by OSM.

Important: Be careful to pass the right place name that OSM needs

Show Code
philly = ox.geocode_to_gdf("Philadelphia, PA")

philly.head()
geometry bbox_west bbox_south bbox_east bbox_north place_id osm_type osm_id lat lon class type place_rank importance addresstype name display_name
0 POLYGON ((-75.28027 39.97496, -75.28023 39.974... -75.280266 39.867005 -74.955831 40.137959 331386626 relation 188022 39.952724 -75.163526 boundary administrative 16 0.766493 city Philadelphia Philadelphia, Philadelphia County, Pennsylvani...
Show Code
philly.crs
<Geographic 2D CRS: EPSG:4326>
Name: WGS 84
Axis Info [ellipsoidal]:
- Lat[north]: Geodetic latitude (degree)
- Lon[east]: Geodetic longitude (degree)
Area of Use:
- name: World.
- bounds: (-180.0, -90.0, 180.0, 90.0)
Datum: World Geodetic System 1984 ensemble
- Ellipsoid: WGS 84
- Prime Meridian: Greenwich

We can plot it just like any other GeoDataFrame

Show Code
# Project it to Web Mercator first and plot
ax = philly.to_crs(epsg=3857).plot(facecolor="none", edgecolor="black")
ax.set_axis_off()

4.2 1.2 Projecting with OSMnx

Key function: project_gdf() (docs)

Automatically projects to the Universal Transverse Mercator (UTM) CRS for the UTM zone that the centroid of the polygon lies in

A good, general projection that works for most latitudes except very northern locations.

Show Code
# ax = ox.project_gdf(philly).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

import geopandas as gpd

# Reproject philly to its best UTM zone
philly_proj = philly.to_crs(philly.estimate_utm_crs())

# Plot
ax = philly_proj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

Some more examples:

Show Code
# Some examples
place1 = ox.geocode_to_gdf("Manhattan, New York City, New York, USA")
place2 = ox.geocode_to_gdf("Miami-Dade County, Florida")
place3 = ox.geocode_to_gdf("Florida, USA")
place4 = ox.geocode_to_gdf("Spain")
Show Code
# # Manhattan
# ax = ox.project_gdf(place1).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

# Reproject philly to its best UTM zone
place1_repoj = place1.to_crs(place1.estimate_utm_crs())
ax = place1_repoj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

Show Code
# # Miami-Dade County
# ax = ox.project_gdf(place2).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

# Reproject philly to its best UTM zone
place2_repoj = place2.to_crs(place2.estimate_utm_crs())
ax = place2_repoj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

Show Code
# # Florida
# ax = ox.project_gdf(place3).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

# Reproject philly to its best UTM zone
place3_repoj = place3.to_crs(place3.estimate_utm_crs())
ax = place3_repoj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

Show Code
# # Spain
# ax = ox.project_gdf(place4).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

# Reproject philly to its best UTM zone
place4_repoj = place4.to_crs(place4.estimate_utm_crs())
ax = place4_repoj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

4.3 1.3 Downloading OSM features

Key functions: features_from_*

  • features_from_place() (docs)
    • Download features within an OSM place boundary
  • features_from_address() (docs)
    • Download features within a certain distance of an address
  • features_from_bbox() (docs)
    • Download features within a N, S, E, W bounding box
  • features_from_point() (docs)
    • Download features within a certain distance of a specified point
  • features_from_polygon() (docs)
    • Download features within a polygon object
About OSM features

Important reference: https://wiki.openstreetmap.org/wiki/Map_Features

  • OSM uses a tagging system to categorize different map features
  • The main feature categories are available on the OSM Wikipedia
    • Examples: ‘amenity’, ‘building’, ‘landuse’, ‘highway’
  • There are specific sub-categories for each feature type too:
    • Amenity examples: ‘bar’, ‘college’, ‘library’

In the language of OSM, the “key” is the main feature category (e.g., amenity) and the “value” is the sub-category type (e.g., “bar”)

osmnx mirrors the key/value syntax of OSM. Use a dict to specify the features you want:

Show Code
# Get all amenities in Philadelphia
amenities = ox.features_from_place("Philadelphia, PA", tags={"amenity": True})
Show Code
len(amenities)
15722
Show Code
amenities.head()
geometry amenity brand brand:wikidata name operator operator:wikidata operator:wikipedia short_name addr:city addr:housenumber addr:postcode addr:state addr:street air_conditioning branch cuisine official_name opening_hours phone ref takeaway website created_by source alt_name atm contact:facebook diet:vegetarian payment:cash payment:credit_cards payment:debit_cards wheelchair brand:website healthcare internet_access url contact:phone description email wikidata brewery contact:instagram diet:vegan education ele gnis:feature_id religion check_date denomination building old_name comment operator:type school wikipedia service_times historic:amenity name:en social_facility operator:short operator:website emergency healthcare:speciality bicycle_parking capacity covered library ref:isil addr:country callsign studio craft microbrewery outdoor_seating drive_through check_date:opening_hours contact:website reservation website:menu addr:unit internet_access:fee shop training toilets:wheelchair contact:linkedin contact:tiktok contact:twitter addr:housename delivery indoor_seating bottle fountain collection_times parking self_service dispensing opening_hours:drive_through opening_hours:signed screen payment:coins smoking architect artist_name wikimedia_commons female fee check_date:opening_hours:drive_through contact:myspace fax bar designation tourism source:pkey fixme access changing_table toilets name:zh addr:full mobile charge panoramax fuel:biodiesel fuel:biogas fuel:cng fuel:diesel fuel:e10 fuel:e85 fuel:electricity sport collection_times:signed ref:signed drive_in compressed_air check_date:collection_times food cash_in indoor toilets:access not:brand:wikidata diet:halal opening_hours:atm payment:apple_pay payment:contactless toilets:handwashing toilets:handwashing:soap check_date:diet:vegan diet:organic diet:meat image:menu image:menu:0 image:menu:1 image:menu:2 panoramax:0 leisure drink:club-mate car_wash note bicycle_rental kiosk min_age network network:wikidata owner owner:wikidata ownership payment:app rental sponsor sponsor:wikidata toilets:disposal opening_hours:bar opening_hours:kitchen diet:pescetarian lgbtq park_ride supervised power_supply addr:place flickr was:shop contact:email facebook instagram twitter youtube source:cuisine disused:shop toilets:position male maxheight wheelchair:description wheelchair:description:en internet_access:ssid layer service:bicycle:chain_tool service:bicycle:pump currency:USD drink:coca-cola drink:coke drink:cola drink:cola_zero drink:soda drink:water vending network:wikipedia amenity_1 recycling:computers recycling:tv_monitor recycling_type ferry public_transport entrance toilets:unisex kitchen_hours animal fixme:atp website:orders website:reservation check_date:wheelchair backrest street_vendor service:bicycle:repair payment:cards name:es diet:kosher social_facility:for theatre:genre beds level payment:visa was:name happy_hours opening_hours:brunch opening_hours:dinner opening_hours:lunch direction office date display faces armrest seats material name:ca addr:city:ar name:ar service:bicycle:tools colour brand:type parcel_locker:type parcel_mail_in parcel_pickup waste historic artwork_type start_date support type payment:american_express payment:discover_card payment:mastercard dog recycling:beverage_cartons recycling:cans recycling:glass_bottles recycling:paper recycling:plastic recycling:plastic_bottles recycling:plastic_packaging contact:yelp portable seasonal unisex internet_access:description man_made particle_accelerator substance payment:cheque heritage clock inscription inscription:1 panoramax:1 bus tram opening_hours:bottle_shop barrier public_bookcase:type check_date:capacity payment:cash_app payment:venmo seating currency:XBT theatre:type smoothness surface opening_hours:Condesa opening_hours:El_Cafe opening_hours:El_Techo shelter_type currency:BCH manufacturer payment:onchain cash_out brand:en brand:zh location lit drinking_water height fridge opening_hours:covid19 diet:healthy abandoned:amenity artwork_subject memorial subject:wikidata payment:lightning payment:lightning_contactless delivery:partner internet_access:password post_box:type check_date:diet:vegetarian description:en check_date:currency:XBT check_date:smoking phone:mnemonic addr:door was:amenity urgent_care community_centre:for community_centre animal_shelter brand:short disused:amenity cash name:etymology name:etymology:wikidata image operator:short_name automated social_centre:for cash_withdrawal nobrand recycling:clothes animal_training parking_space bike_ride bin polling_station shop:music:vinyl books manufacturer:wikidata model model:ref addr:floor diet survey:date former:shop cafe contact:bluesky website:booking fuel nursery preschool diet:gluten_free int_name old_ref mimics fast_food gender_segregated heating live_music was:addr:housenumber healthcare:for tactile_paving animal_boarding recycling:waste authentication:app bicycle frequency hgv maxstay motorcar network:website payment:app:tesla ref:supercharge_info scooter socket:nacs socket:nacs:output diet:mediterranean landuse restaurant seeds building:levels capacity:disabled building:floor ref:nrhp building:material roof:levels roof:shape vehicle natural water building:use lanes ship:type wifi orientation name:he source:name basilica diocese website:en roof:material access:conditional rite heritage:operator building:architecture heritage:website contact:mastodon architect:wikidata building:levels:underground nrhp:criteria nrhp:inscription_date building:colour ref:dove check_date:compressed_air nonsquare name:ja name:zn roof:orientation demolished:building historic:name grades farm_boxes disused:name post_office building:part monastery:type theme bench loc_name drink subdenomination police was:cuisine was:delivery was:drive_through was:outdoor_seating was:takeaway school:type old_name1 old_name2 elevation fuel:octane_95 fuel:gasoline fuel:octane_87 healthcare:counselling parking:orientation area protection_title source_ref country house diet:lacto_vegetarian name:vi isced:level pedagogy school:gender statue crossing:markings
element id
node 109811385 POINT (-75.19487 40.05846) bench NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
110237774 POINT (-75.15662 39.9504) parking_entrance NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
274216093 POINT (-75.19125 39.95764) atm Citibank Q857063 Citibank Citibank Q857063 en:Citibank Citi NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
274217596 POINT (-75.19229 39.95301) cafe Starbucks Q37158 Starbucks NaN NaN NaN NaN Philadelphia 3401 19104 PA Walnut Street yes Walnut & 34th coffee_shop Starbucks Coffee Mo-Fr 05:30-20:00; Sa,Su 06:00-20:00 +1-215-387-1914 14716 yes https://www.starbucks.com/store-locator/store/... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
313440966 POINT (-75.16694 39.96394) car_sharing NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Potlatch 0.10f local_knowledge NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
# Get all bars in philadelphia
bars = ox.features_from_place("Philadelphia, PA", tags={"amenity": "bar"})
Show Code
len(bars)
165
Show Code
bars.head()
geometry addr:housenumber addr:street amenity contact:phone contact:website description name opening_hours outdoor_seating check_date contact:facebook addr:postcode phone website addr:city air_conditioning smoking toilets:wheelchair wheelchair check_date:opening_hours opening_hours:signed indoor_seating contact:instagram leisure sport lgbtq access brand brand:wikidata wheelchair:description opening_hours:kitchen addr:state branch cuisine fixme name:en name:es addr:unit email craft heritage wikidata wikipedia brewery min_age opening_hours:bottle_shop operator alt_name height source internet_access website:menu landuse microbrewery restaurant atm building building:levels food nonsquare shop contact:tiktok contact:twitter level designation
element id
node 1033935437 POINT (-75.17552 39.95242) 2101 Chestnut Street bar +1 215-568-3355 https://mixbarandgrillphilly.com/location/mix-... The bar is open until whenever the rush ends. Mix Bar & Grill Mo-We,Su 11:00-22:00; Th-Sa 11:00-23:00 yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1167079387 POINT (-75.14925 39.9417) 401 South Street bar +1 215-925-6455 https://www.milkboy.tv/southstreet NaN MilkBoy South Street Mo-Tu,Su 11:00-24:00; We-Sa 11:00-25:00 NaN 2023-04-12 https://www.facebook.com/milkboysouthstreet NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1204761128 POINT (-75.16363 39.92685) NaN NaN bar NaN NaN NaN Vikings High School Club NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1424271155 POINT (-75.14909 39.94152) 344 South Street bar NaN NaN NaN Copabanana Mo-Su 11:30-02:00 NaN NaN NaN 19147 +1 215-923-6180 https://copabanana.com/ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1475230378 POINT (-75.14002 39.96627) 1001 North 2nd Street bar NaN NaN NaN Gunner's Run Mo-Su 11:00-02:00 NaN NaN NaN 19123 +1 215-923-4600 http://gunnersrun.com/ Philadelphia NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
# Get bar, pub, and restaurant features in Philadelphia
food_and_drink = ox.features_from_place(
    "Philadelphia, PA", tags={"amenity": ["pub", "bar", "restaurant"]}
)
Show Code
len(food_and_drink)
1155
Show Code
food_and_drink.head()
geometry addr:city addr:housenumber addr:postcode addr:state addr:street alt_name amenity atm contact:facebook cuisine diet:vegetarian name opening_hours payment:cash payment:credit_cards payment:debit_cards source wheelchair brewery contact:instagram diet:vegan email phone website check_date craft microbrewery outdoor_seating brand brand:wikidata check_date:opening_hours contact:website reservation website:menu contact:phone contact:twitter internet_access self_service indoor_seating opening_hours:signed description wikimedia_commons air_conditioning smoking bar designation takeaway addr:housename toilets:wheelchair short_name name:zh sport delivery drive_in food not:brand:wikidata toilets diet:halal addr:country drive_through branch official_name diet:organic diet:meat image:menu image:menu:0 image:menu:1 image:menu:2 panoramax panoramax:0 leisure opening_hours:bar opening_hours:kitchen operator diet:pescetarian lgbtq source:cuisine access wheelchair:description facebook ref amenity_1 capacity fax kitchen_hours wikidata fixme website:orders website:reservation name:en street_vendor addr:unit name:es was:name level note happy_hours opening_hours:brunch opening_hours:dinner opening_hours:lunch payment:apple_pay payment:cards payment:contactless name:ca internet_access:fee payment:american_express payment:discover_card payment:mastercard payment:visa start_date contact:yelp internet_access:description internet_access:ssid heritage wikipedia min_age opening_hours:bottle_shop opening_hours:Condesa opening_hours:El_Cafe opening_hours:El_Techo diet:healthy delivery:partner toilets:access height check_date:smoking phone:mnemonic diet:gluten_free was:addr:housenumber diet:mediterranean toilets:unisex landuse restaurant panoramax:1 building historic ship:type source:name website:en building:levels contact:mastodon image roof:levels name:ja name:zn nonsquare shop theme building:colour building:material roof:shape contact:tiktok house
element id
node 333786044 POINT (-75.15893 39.94086) Philadelphia 735 19147 PA South 10th Street Morning Glory Diner restaurant yes https://www.facebook.com/MorningGloryDiner/ diner yes Sam's Morning Glory Mo-Fr 08:00-14:00; Sa,Su 08:00-15:00 yes no no knowledge;survey limited NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
343293806 POINT (-75.15946 39.96073) Philadelphia 501 19123 PA North 13th Street NaN pub NaN NaN american;burger;fish_and_chips;sandwich yes Prohibition Taproom Fr-Sa 12:00-01:00; Su 12:00-00:00; Mo-Th 16:00... NaN NaN NaN survey NaN yes prohibition_taproom yes info@theprohibitiontaproom.com 215-238-1818 http://theprohibitiontaproom.com/ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
566683522 POINT (-75.15755 39.96205) Philadelphia 1139 19123 NaN Spring Garden Street NaN restaurant NaN NaN pizza NaN Spring Garden Pizza & Restaurant Mo-Fr 08:00-20:00; Sa 08:00-17:00; Su off NaN NaN NaN NaN NaN NaN NaN NaN NaN +1 215-765-7665 https://www.springgardenpizza.com 2023-10-11 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
596230881 POINT (-75.18682 40.05492) NaN NaN NaN NaN NaN NaN restaurant NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
596245658 POINT (-75.19035 40.0592) Philadelphia 7136 19119 PA Germantown Avenue NaN restaurant NaN NaN NaN NaN Earth Bread & Brewery NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN brewery yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
# Get bus stop features
bus_stops = ox.features_from_place("Philadelphia, PA", tags={"highway": "bus_stop"})
Show Code
len(bus_stops)
334
Show Code
bus_stops.head()
geometry bench bus covered highway name network network:wikidata operator public_transport ref shelter network:wikipedia tactile_paving wheelchair route_ref local_ref bin lit designation source check_date:shelter departures_board internet_access addr:street route_ref_1 operator:wikidata description note brand brand:wikidata railway tram trolleybus network:short not:network:wikidata advertising addr:city addr:housenumber addr:postcode addr:state ref:signed fixme sign panoramax
element id
node 361011456 POINT (-75.16166 39.95223) yes yes yes bus_stop 13th St & Market St SEPTA Q2037863 SEPTA platform 10264 yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
750281693 POINT (-75.07732 40.01797) NaN yes NaN bus_stop NaN NaN NaN NaN platform NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
768271130 POINT (-75.20726 40.01487) NaN yes NaN bus_stop Wissahickon Transportation Center SEPTA Q2037863 SEPTA platform NaN yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1015342921 POINT (-75.18187 39.9664) NaN yes NaN bus_stop NaN NaN NaN NaN platform NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1015342926 POINT (-75.18024 39.9667) NaN yes NaN bus_stop NaN NaN NaN NaN platform NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
# Get commercial and retail landuse features
landuse = ox.features_from_place(
    "Philadelphia, PA", tags={"landuse": ["commercial", "retail"]}
)
Show Code
len(landuse)
349

Let’s plot the land use features:

Show Code
from matplotlib import pyplot as plt

fig, ax = plt.subplots(figsize=(10, 6))

ax = landuse.plot(ax=ax)
ax.set_axis_off()

4.4 1.4 Downloading street networks

Key functions: graph_from_*

  • graph_from_place() (docs)
    • Download street network within an OSM place boundary
  • graph_from_address() (docs)
    • Download street network within a certain distance of an address
  • graph_from_bbox() (docs)
    • Download street network within a N, S, E, W bounding box
  • graph_from_point() (docs)
    • Download street network within a certain distance of a specified point
  • graph_from_polygon() (docs)
    • Download street network within a polygon object

4.4.1 Street network around an address

Get streets within 500 meters of the center of Center City

Show Code
G = ox.graph_from_address("Center City, Philadelphia, PA", dist=500)

Project and plot it:

Show Code
G_projected = ox.project_graph(G)
ox.plot_graph(G_projected)

Remove the nodes:

Show Code
ox.plot_graph(G_projected, node_size=0);

Let’s zoom out to 2,000 meters. This will take a little longer.

Show Code
G = ox.graph_from_address("Center City, Philadelphia, PA", dist=2000)
G_projected = ox.project_graph(G)
Show Code
ox.plot_graph(G_projected, node_size=0);

4.4.2 Getting different network types

  • drive - get drivable public streets (but not service roads)
  • drive_service - get drivable streets, including service roads
  • walk - get all streets and paths that pedestrians can use (this network type ignores one-way directionality)
  • bike - get all streets and paths that cyclists can use
  • all - download all non-private OSM streets and paths
  • all_private - download all OSM streets and paths, including private-access ones (default)
Show Code
# the "drive" network
G = ox.graph_from_address("Center City, Philadelphia, PA", network_type="drive", dist=2000)
ox.plot_graph(G)

Show Code
# the "walk" network
G = ox.graph_from_address("Center City, Philadelphia, PA", network_type="walk", dist=2000)
ox.plot_graph(ox.project_graph(G))

4.4.3 Street network within a place boundary

Use graph_from_place() to get the streets within a specific OSM place.

Caution

A couple of things to watch out for: 1. The place query has to be resolved by OSM. 2. If the place is a big city, you might be downloading a lot of data!

Let’s check out the street network for Berkeley, CA:

Show Code
berkeley = ox.graph_from_place("Berkeley, California, USA")
Show Code
ox.plot_graph(ox.project_graph(berkeley), node_size=0)

4.4.4 Streets within a specific polygon

Example: Let’s download all streets within Center City. We will use the “Central” planning district as a proxy for this area. The city’s planning districts are available on Open Data Philly.

Show Code
planning_districts = gpd.read_file(
    "https://opendata.arcgis.com/datasets/0960ea0f38f44146bb562f2b212075aa_0.geojson"
)
Show Code
len(planning_districts)
18
Show Code
planning_districts.head()
objectid dist_name abbrev Shape__Area Shape__Length geometry
0 1 River Wards RW 3.338947e+07 26635.524113 POLYGON ((-75.09798 40.00496, -75.09687 40.005...
1 2 North Delaware NDEL 4.285306e+07 35525.335312 POLYGON ((-74.98159 40.05363, -74.98139 40.053...
2 3 Lower Far Northeast LFNE 4.875252e+07 36958.071333 POLYGON ((-74.96443 40.11728, -74.96434 40.117...
3 4 Central CTR 2.822133e+07 28401.823065 POLYGON ((-75.14791 39.96733, -75.14715 39.967...
4 5 University Southwest USW 2.051763e+07 25957.938149 POLYGON ((-75.18742 39.96338, -75.18644 39.963...

Trim to the central district:

Show Code
central_district = planning_districts.query("dist_name == 'Central'")

And plot it:

Show Code
## old version previous OSMnx 2.0
# ax = ox.project_gdf(central_district).plot(fc="lightblue", ec="gray")
# ax.set_axis_off()

# Reproject philly to its best UTM zone
central_district_repoj = central_district.to_crs(central_district.estimate_utm_crs())
ax = central_district_repoj.plot(fc="lightblue", ec="gray")
ax.set_axis_off()

Show Code
central_district, central_district_repoj.crs
(   objectid dist_name abbrev   Shape__Area  Shape__Length  \
 3         4   Central    CTR  2.822133e+07   28401.823065   
 
                                             geometry  
 3  POLYGON ((-75.14791 39.96733, -75.14715 39.967...  ,
 <Projected CRS: EPSG:32618>
 Name: WGS 84 / UTM zone 18N
 Axis Info [cartesian]:
 - E[east]: Easting (metre)
 - N[north]: Northing (metre)
 Area of Use:
 - name: Between 78°W and 72°W, northern hemisphere between equator and 84°N, onshore and offshore. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamaica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.
 - bounds: (-78.0, 0.0, -72.0, 84.0)
 Coordinate Operation:
 - name: UTM zone 18N
 - method: Transverse Mercator
 Datum: World Geodetic System 1984 ensemble
 - Ellipsoid: WGS 84
 - Prime Meridian: Greenwich)

Squeeze it so we can get the geometry polygon:

Show Code
center_city_outline = central_district.squeeze().geometry

center_city_outline, type(center_city_outline)
(<POLYGON ((-75.148 39.967, -75.147 39.967, -75.147 39.969, -75.147 39.97, -7...>,
 shapely.geometry.polygon.Polygon)

Now, let’s use ox.graph_from_polygon() to extract streets within this polygon.

Show Code
# Get the graph
G_cc = ox.graph_from_polygon(center_city_outline, network_type="drive")
Show Code
# Viola!
ox.plot_graph(ox.project_graph(G_cc), node_size=0);

4.5 1.5 Converting from a graph to a GeoDataFrame

Key function: ox.graph_to_gdfs() (docs)

You can get a GeoDataFrame for both the nodes (points) and edges (lines)

Show Code
type(G_cc)
networkx.classes.multidigraph.MultiDiGraph
Show Code
# only get the edges
cc_edges = ox.graph_to_gdfs(G_cc, edges=True, nodes=False)
Show Code
# we have lots of data associated with each edge!
cc_edges.head()
osmid highway lanes name oneway reversed length geometry maxspeed ref bridge tunnel width service access junction
u v key
109727439 109911666 0 132508434 residential 1 Bainbridge Street True False 44.347013 LINESTRING (-75.17104 39.94345, -75.1706 39.94... NaN NaN NaN NaN NaN NaN NaN NaN
109727448 109727439 0 12109011 residential NaN South Colorado Street True False 109.496448 LINESTRING (-75.17125 39.94248, -75.1712 39.94... NaN NaN NaN NaN NaN NaN NaN NaN
110034229 0 12159387 residential NaN Fitzwater Street True False 91.354184 LINESTRING (-75.17125 39.94248, -75.17129 39.9... NaN NaN NaN NaN NaN NaN NaN NaN
109727507 110024052 0 193364514 residential NaN Carpenter Street True False 53.208442 LINESTRING (-75.17196 39.93974, -75.17134 39.9... NaN NaN NaN NaN NaN NaN NaN NaN
109728761 110274344 0 672312336 residential NaN Brown Street True False 58.270358 LINESTRING (-75.17317 39.96951, -75.1725 39.96... 25 mph NaN NaN NaN NaN NaN NaN NaN
Show Code
# plot it like any old GeoDataFrame
ax = cc_edges.to_crs(epsg=3857).plot(color="gray")

# add the neighborhood boundaries
boundary = gpd.GeoSeries([center_city_outline], crs="EPSG:4326")
boundary.to_crs(epsg=3857).plot(
    ax=ax, facecolor="none", edgecolor="red", linewidth=3, zorder=2
)

ax.set_axis_off()

Don’t forget: We can use the .explore() function to get an interactive web map via Folium:

Show Code
cc_edges.explore(tiles='cartodb positron')
Make this Notebook Trusted to load map: File -> Trust Notebook

4.6 1.6 What can we do with the graph?

  • Network-based statistics
  • Routing
  • Street orientations
  • Visualizing crashes

And much more: see the OSMnx repository of Jupyter notebook examples

4.6.1 Street orientations

A great blog post on street orientations across different US and global cities.

One of my favorite examples of data viz, using matplotlib for radial histograms of street orientations…

The code for these histograms is available in the osmnx examples repository.

4.6.2 Network statistics

We can use the ox.basic_stats() to get some basic network statistics

Show Code
ox.basic_stats(G_cc)
{'n': 2097,
 'm': 4027,
 'k_avg': 3.8407248450166906,
 'edge_length_total': 357852.7307807873,
 'edge_length_avg': 88.86335504861864,
 'streets_per_node_avg': 3.407248450166905,
 'streets_per_node_counts': {0: 0,
  1: 61,
  2: 12,
  3: 1058,
  4: 949,
  5: 13,
  6: 3,
  7: 1},
 'streets_per_node_proportions': {0: 0.0,
  1: 0.029089175011921792,
  2: 0.005722460658082976,
  3: 0.5045302813543157,
  4: 0.452551263710062,
  5: 0.00619933237958989,
  6: 0.001430615164520744,
  7: 0.0004768717215069146},
 'intersection_count': 2036,
 'street_length_total': 311421.4931922978,
 'street_segment_count': 3484,
 'street_length_avg': 89.38619207586045,
 'circuity_avg': 1.0159857056912147,
 'self_loop_proportion': 0.000574052812858783}

4.6.3 Finding the shortest route

Let’s calculate the shortest route between the Art Museum and the Liberty Bell.

We’ll need to download all amenities in Philadelphia of type “tourism”.

  • The ox.features_from_place() can download OSM features with a specific tag
  • You can consult the OSM pages (the Art Museum and Liberty Bell) for each feature for additional info
  • Both features are categorized as “tourism” in the OSM data — use the “tags” keyword to select this category
Show Code
philly_tourism = ox.features_from_place("Philadelphia, PA", tags={"tourism": True})
Show Code
len(philly_tourism)
928
Show Code
philly_tourism.head()
geometry ele gnis:feature_id name tourism addr:city addr:housenumber addr:postcode addr:state addr:street air_conditioning brand brand:wikidata email internet_access operator phone website artwork_type historic source wikidata information artist_name material check_date contact:facebook fee colour start_date wheelchair wikipedia addr:country landmark name:de opening_hours designation amenity description museum operator:type alt_name artwork_subject artist:wikidata height subject:wikidata name:fr statue memorial subject:wikipedia year_of_construction name:ru contact:email branch ref panoramax board_type contact:instagram toilets:wheelchair loc_name inscription level natural attraction note wikimedia_commons location display support end_date comment layer historic:amenity postal_code official_name brand:short short_name guest_house inscription:url gender bicycle hiking covered drinking_water openfire internet_access:fee rooms addr:unit old_name image mimics source:url direction board:title departures_board direction_southeast horse mtb map_size map_type access direction_east direction_north direction_west name:signed direction_southwest guidepost direction_northeast direction_northwest ref:signed direction_south fixme noname check_date:opening_hours opening_hours:signed bar swimming_pool highway lanes name:etymology oneway service surface tiger:cfcc tiger:name_base tiger:name_type tiger:zip_left tiger:zip_right building building:material ref:nrhp building:levels name:hi roof:shape building:wikidata building:wikipedia heritage heritage:operator heritage:website nrhp:criteria nrhp:inscription_date nrhp:nhl protection_title source_ref smoking building:colour fax contact:fax contact:phone ship:type addr:housename disused:amenity roof:material abandoned:amenity internet_access:ssid old_name:2015 parking old_name:1994-2015 fee:conditional shop roof:levels mtb:scale:imba name:zh artist:website bridge foot lit trail_visibility width bridge:structure man_made barrier leisure disused:website contact:website boundary operator:short operator:wikidata ownership protected building:part name:en area subject tower:construction tower:type area:highway step_count type roof:colour place
element id
node 357371322 POINT (-75.1958 39.9697) 17 2347097 Bird Lake Picnic Area picnic_site NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
360500844 POINT (-75.19582 39.95352) NaN NaN Hilton Inn at Penn hotel Philadelphia 3600 19104 PA Sansom Street yes Hilton Q598884 PHLID_Hotel@hilton.com wlan Hilton +1-215-222-0200 https://www.hilton.com/en/hotels/phlidhh-the-i... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
360515304 POINT (-75.1486 39.94771) NaN NaN Robert Morris artwork NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN statue memorial survey NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
360542779 POINT (-75.18932 39.9554) NaN NaN Mario the Magnificent artwork NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN statue NaN NaN Q98563440 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
360777728 POINT (-75.19021 39.9523) NaN NaN Pennsylvania Historical Marker: ENIAC, first a... information NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN board NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
# How to find the name of the POI: search for keywords
philly_tourism.loc[philly_tourism['name'].str.contains("Art", na=False)]
geometry ele gnis:feature_id name tourism addr:city addr:housenumber addr:postcode addr:state addr:street air_conditioning brand brand:wikidata email internet_access operator phone website artwork_type historic source wikidata information artist_name material check_date contact:facebook fee colour start_date wheelchair wikipedia addr:country landmark name:de opening_hours designation amenity description museum operator:type alt_name artwork_subject artist:wikidata height subject:wikidata name:fr statue memorial subject:wikipedia year_of_construction name:ru contact:email branch ref panoramax board_type contact:instagram toilets:wheelchair loc_name inscription level natural attraction note wikimedia_commons location display support end_date comment layer historic:amenity postal_code official_name brand:short short_name guest_house inscription:url gender bicycle hiking covered drinking_water openfire internet_access:fee rooms addr:unit old_name image mimics source:url direction board:title departures_board direction_southeast horse mtb map_size map_type access direction_east direction_north direction_west name:signed direction_southwest guidepost direction_northeast direction_northwest ref:signed direction_south fixme noname check_date:opening_hours opening_hours:signed bar swimming_pool highway lanes name:etymology oneway service surface tiger:cfcc tiger:name_base tiger:name_type tiger:zip_left tiger:zip_right building building:material ref:nrhp building:levels name:hi roof:shape building:wikidata building:wikipedia heritage heritage:operator heritage:website nrhp:criteria nrhp:inscription_date nrhp:nhl protection_title source_ref smoking building:colour fax contact:fax contact:phone ship:type addr:housename disused:amenity roof:material abandoned:amenity internet_access:ssid old_name:2015 parking old_name:1994-2015 fee:conditional shop roof:levels mtb:scale:imba name:zh artist:website bridge foot lit trail_visibility width bridge:structure man_made barrier leisure disused:website contact:website boundary operator:short operator:wikidata ownership protected building:part name:en area subject tower:construction tower:type area:highway step_count type roof:colour place
element id
node 367974278 POINT (-75.1524 40.03748) 61 2349240 La Salle University Art Museum museum Philadelphia 1900 NaN PA West Olney Avenue NaN NaN NaN NaN NaN NaN NaN https://artcollection.lasalle.edu/ NaN NaN USGS Geonames Q16893816 NaN NaN NaN 2024-08-25 https://www.facebook.com/LaSalleUniversityArtM... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4064343335 POINT (-75.22113 40.02427) NaN NaN Soft Illusions Fine Art Gallery gallery Philadelphia 4226 19127 PA Main Street NaN NaN NaN NaN NaN NaN +1-215-840-0832 http://www.softillusions.net/ NaN NaN NaN NaN NaN NaN NaN 2025-06-01 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5368454121 POINT (-75.19477 39.95406) NaN NaN Institute of Contemporary Art museum Philadelphia 118 19104 PA South 36th Street NaN NaN NaN NaN NaN NaN +1 215-898-5911 https://icaphila.org NaN NaN NaN NaN NaN NaN NaN NaN ICAPhiladelphia no NaN NaN yes NaN NaN NaN NaN We-Su 12:00-18:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ICAPhiladelphia yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
5718906477 POINT (-75.13058 39.99573) NaN NaN Art Making Machine Studios gallery Philadelphia 3000 19133 PA Hope Street NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6639391809 POINT (-75.16088 39.96383) NaN NaN Philadelphia Museum of Jewish Art museum Philadelphia 615 19123 PA North Broad Street NaN NaN NaN NaN NaN NaN +1 215-627-6747 https://rodephshalom.org/community/philadelphi... NaN NaN NaN NaN NaN NaN NaN 2023-10-11 NaN no NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
6680708848 POINT (-75.16833 39.94733) NaN NaN Romanian Folk Art Museum museum Philadelphia 1606 19103 PA Spruce Street NaN NaN NaN NaN NaN NaN NaN http://www.romanianculture.us/ NaN NaN NaN Q113484178 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12188327106 POINT (-75.14215 39.95191) NaN NaN Arch Enemy Arts gallery Philadelphia 109 19106 PA Arch Street NaN NaN NaN NaN NaN NaN +1 215-717-7774 https://www.archenemyarts.com/ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12193292355 POINT (-75.14336 39.9522) NaN NaN Twelve Gates Arts gallery Philadelphia 106 19106 PA North 2nd Street NaN NaN NaN NaN NaN NaN +1 215 253-8578 https://www.twelvegatesarts.org/ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12222614599 POINT (-75.14334 39.95113) NaN NaN Larry Becker Contemporary Art gallery Philadelphia 43 19106 PA North 2nd Street NaN NaN NaN NaN NaN NaN +1-215-925-5389 https://www.artnet.com/galleries/larry-becker-... NaN NaN NaN NaN NaN NaN NaN NaN NaN no NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2025-02-22 no NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
12235452452 POINT (-75.14486 39.95339) NaN NaN Museum for Art in Wood museum Philadelphia 141 19106 PA North 3rd Street NaN NaN NaN NaN NaN NaN +1-215-923-8000 https://museumforartinwood.org/ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN We-Su 12:00-17:00; Mo-Tu off NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
way 28533972 POLYGON ((-75.18117 39.96468, -75.18141 39.964... 32 NaN Philadelphia Art Museum museum Philadelphia 2600 19130 PA Benjamin Franklin Parkway NaN NaN NaN NaN NaN NaN +1-215-763-8100 https://www.philamuseum.org/ NaN NaN NaN Q510324 NaN NaN NaN 2025-10-08 NaN yes NaN NaN yes en:Philadelphia Museum of Art NaN NaN NaN Su,Mo,Th,Sa 10:00-17:00; Fr 10:00-20:45 NaN NaN NaN art NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Philadelphia Museum of Art NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN yes NaN NaN 4 फिलाडेल्फिया कला संग्रहालय NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
333931830 POLYGON ((-75.1641 39.95543, -75.16416 39.9551... 13 1196718 Pennsylvania Academy of the Fine Arts museum Philadelphia 118 19102 PA North Broad Street NaN NaN NaN NaN NaN NaN +1-215-972-7600 https://www.pafa.org/ NaN building NaN Q1952033 NaN NaN NaN NaN NaN NaN NaN NaN NaN en:Pennsylvania Academy of the Fine Arts US NaN NaN Tu-Fr 10:00-17:00; Sa-Su 11:00-17:00 NaN NaN NaN art NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN yes NaN 71000731 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
988345364 POLYGON ((-75.21926 40.0832, -75.21931 40.0832... 84 NaN Woodmere Art Museum museum Philadelphia 9201 19118 PA Germantown Avenue NaN NaN NaN NaN NaN NaN NaN https://woodmereartmuseum.org/ NaN NaN esri/Philadelphia_PA_Buildings_OSM Q2424929 NaN NaN NaN NaN NaN yes NaN NaN yes NaN NaN NaN NaN We-Su 10:00-17:00; Sa 10:00-18:00 NaN NaN NaN NaN NaN NaN NaN NaN 20.72 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2023-06-10 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN yes NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
art_museum = philly_tourism.query("name == 'Philadelphia Art Museum'").squeeze()

art_museum.geometry

Show Code
liberty_bell = philly_tourism.query("name == 'Liberty Bell'").squeeze()

liberty_bell.geometry

Now, extract the lat and lng coordinates

For the Art Museum geometry, we can use the .geometry.centroid attribute to calculate the centroid of the building footprint.

Show Code
liberty_bell_x = liberty_bell.geometry.x
liberty_bell_y = liberty_bell.geometry.y
Show Code
art_museum_x = art_museum.geometry.centroid.x
art_museum_y = art_museum.geometry.centroid.y

Find the nearest nodes on our OSMnx graph, using the ox.nearest_nodes() function

Show Code
ox.nearest_nodes?
Signature: ox.nearest_nodes(G, X, Y, return_dist=False)
Docstring:
Find the nearest node to a point or to each of several points.
If `X` and `Y` are single coordinate values, this will return the nearest
node to that point. If `X` and `Y` are lists of coordinate values, this
will return the nearest node to each point.
If the graph is projected, this uses a k-d tree for euclidean nearest
neighbor search, which requires that scipy is installed as an optional
dependency. If it is unprojected, this uses a ball tree for haversine
nearest neighbor search, which requires that scikit-learn is installed as
an optional dependency.
Parameters
----------
G : networkx.MultiDiGraph
    graph in which to find nearest nodes
X : float or list
    points' x (longitude) coordinates, in same CRS/units as graph and
    containing no nulls
Y : float or list
    points' y (latitude) coordinates, in same CRS/units as graph and
    containing no nulls
return_dist : bool
    optionally also return distance between points and nearest nodes
Returns
-------
nn or (nn, dist) : int/list or tuple
    nearest node IDs or optionally a tuple where `dist` contains distances
    between the points and their nearest nodes
File:      ~/mambaforge/envs/musa-550-fall-2023/lib/python3.10/site-packages/osmnx/distance.py
Type:      function
Show Code
art_museum_y
39.9656755285648
Show Code
# Get the origin node
orig_node = ox.nearest_nodes(G_cc, liberty_bell_x, liberty_bell_y) 

# Get the destination node
dest_node = ox.nearest_nodes(G_cc, art_museum_x, art_museum_y)

Now, we can use ox.shortest_path() function to find the shortest path between these graph nodes.

Note

We need to specify weight=‘length’ to find the shortest path by minimizing distance traveled (otherwise it treats each edge as weight=1).

Show Code
# get the shortest path --> just a list of node IDs
route1 = ox.shortest_path(G_cc, orig_node, dest_node, weight="length")

route1
[3408446156,
 110217312,
 3425012161,
 109814427,
 5372039288,
 109814445,
 109814449,
 5358069713,
 5372059864,
 2644235371,
 5534891499,
 110540235,
 109750941,
 110402209,
 110402230,
 534960802,
 110391250,
 637791907,
 637791980,
 110329803,
 110329806,
 775897224,
 3414249481,
 110329822,
 110391452,
 110353061,
 11162290432,
 110054089,
 775897147,
 110329848,
 110329851,
 110125895,
 534969088,
 109745905,
 109740423,
 110330569,
 550175399]

Use ox.plot_graph_route() to plot a graph and highlight a specific route

Show Code
ox.plot_graph_route(G_cc, route1, node_size=0)

How about an interactive version?

osmnx has a helper function ox.utils_graph.route_to_gdf() to convert a route to a GeoDataFrame of edges.

Show Code
# ox.utils_graph.route_to_gdf(G_cc, route1, weight="length").explore(
#     tiles="cartodb positron",
#     color="red",
# )

## new OSMnx 2.0 version
import osmnx as ox

# New import location
from osmnx import routing
# Convert route to GeoDataFrame
gdf_route = routing.route_to_gdf(G_cc, route1, weight="length")

# Explore with folium/leafmap
gdf_route.explore(
    tiles="cartodb positron",
    color="red"
)
Make this Notebook Trusted to load map: File -> Trust Notebook

4.6.4 Finding the shortest travel time

The add_edge_speeds function add edge speeds (km per hour) to graph as new speed_kph edge attributes.

The function will add free-flow travel speeds for all edges based on the average maxspeed value of edges, per highway type. This process can definitely be imprecise, but in the case that you happen to have more precise speed data, you can supply your own data instead of relying on OSM data.

Show Code
# impute speed on all edges missing data
G_cc = ox.add_edge_speeds(G_cc)

# calculate travel time (seconds) for all edges
G_cc = ox.add_edge_travel_times(G_cc)
Show Code
# Get the graph edges
edges = ox.graph_to_gdfs(G_cc, nodes=False)
Show Code
edges.head()
osmid highway lanes name oneway reversed length geometry speed_kph travel_time maxspeed ref bridge tunnel width service access junction
u v key
109727439 109911666 0 132508434 residential 1 Bainbridge Street True False 44.347013 LINESTRING (-75.17104 39.94345, -75.1706 39.94... 38.467115 4.150279 NaN NaN NaN NaN NaN NaN NaN NaN
109727448 109727439 0 12109011 residential NaN South Colorado Street True False 109.496448 LINESTRING (-75.17125 39.94248, -75.1712 39.94... 38.467115 10.247382 NaN NaN NaN NaN NaN NaN NaN NaN
110034229 0 12159387 residential NaN Fitzwater Street True False 91.354184 LINESTRING (-75.17125 39.94248, -75.17129 39.9... 38.467115 8.549512 NaN NaN NaN NaN NaN NaN NaN NaN
109727507 110024052 0 193364514 residential NaN Carpenter Street True False 53.208442 LINESTRING (-75.17196 39.93974, -75.17134 39.9... 38.467115 4.979588 NaN NaN NaN NaN NaN NaN NaN NaN
109728761 110274344 0 672312336 residential NaN Brown Street True False 58.270358 LINESTRING (-75.17317 39.96951, -75.1725 39.96... 40.233500 5.213896 25 mph NaN NaN NaN NaN NaN NaN NaN
Show Code
# Groupby highway type and get the mean values
edges["highway"] = edges["highway"].astype(str)
edges.groupby("highway")[["length", "speed_kph", "travel_time"]].mean()
length speed_kph travel_time
highway
['motorway_link', 'secondary_link'] 224.673048 40.233500 20.103222
['residential', 'unclassified'] 258.436611 40.233500 23.124307
['tertiary', 'motorway_link'] 151.598640 40.233500 13.564694
living_street 52.876864 45.884028 4.148649
motorway 446.906218 82.720076 19.204545
motorway_link 309.892510 40.233500 27.728461
primary 102.958582 44.388523 8.381328
primary_link 53.891964 40.233500 4.822128
residential 80.963002 38.465687 7.603245
secondary 95.551672 42.295051 8.265380
tertiary 77.123739 41.373732 6.728209
tertiary_link 39.973430 40.233500 3.576730
trunk 54.151559 50.962433 3.925862
trunk_link 179.573840 45.884028 14.089126
unclassified 123.510873 37.934443 11.866320
Show Code
# calculate two routes by minimizing travel time
route2 = ox.shortest_path(G_cc, orig_node, dest_node, weight="travel_time")
Show Code
# plot the routes
fig, ax = ox.plot_graph_routes(
    G_cc,
    routes=[route1, route2],
    route_colors=["r", "y"],
    route_linewidth=6,
    node_size=0,
)

Let’s plot both in an interactive map:

Show Code
# m = ox.utils_graph.route_to_gdf(G_cc, route1, weight="length").explore(
#     tiles="cartodb dark matter",
#     color="red",
# )

# m = ox.utils_graph.route_to_gdf(G_cc, route2, weight="length").explore(
#     tiles="cartodb dark matter",
#     color="yellow",
#     m=m
# )


from osmnx import routing  # new location for route_to_gdf

# First route
gdf_route1 = routing.route_to_gdf(G_cc, route1, weight="length")
m = gdf_route1.explore(
    tiles="cartodb dark_matter",
    color="red"
)

# Second route on same map
gdf_route2 = routing.route_to_gdf(G_cc, route2, weight="length")
m = gdf_route2.explore(
    tiles="cartodb dark_matter",
    color="yellow",
    m=m
)

m
Make this Notebook Trusted to load map: File -> Trust Notebook

Let’s compare to the two routes:

Distances:

Show Code
# meters_to_miles = 0.0006213712

# # compare the two routes
# route1_length = (
#     ox.utils_graph.route_to_gdf(G_cc, route1, weight="length")["length"].sum()
#     * meters_to_miles
# )

# route2_length = (
#     ox.utils_graph.route_to_gdf(G_cc, route2, weight="length")["length"].sum()
#     * meters_to_miles
# )

import osmnx as ox
from osmnx import routing  # new module for route_to_gdf

meters_to_miles = 0.0006213712

# Compare the two routes
route1_length = (
    routing.route_to_gdf(G_cc, route1, weight="length")["length"].sum()
    * meters_to_miles
)

route2_length = (
    routing.route_to_gdf(G_cc, route2, weight="length")["length"].sum()
    * meters_to_miles
)

print(f"Route 1 length: {route1_length:.2f} miles")
print(f"Route 2 length: {route2_length:.2f} miles")
Route 1 length: 2.19 miles
Route 2 length: 2.46 miles

Travel times:

Show Code
seconds_to_mins = 1.0 / 60

# route1_time = (
#     ox.utils_graph.route_to_gdf(G_cc, route1, weight="travel_time")["travel_time"].sum()
#     * seconds_to_mins
# )
# route2_time = (
#     ox.utils_graph.route_to_gdf(G_cc, route2, weight="travel_time")["travel_time"].sum()
#     * seconds_to_mins
# )

route1_time = (
    routing.route_to_gdf(G_cc, route1, weight="travel_time")["travel_time"].sum()
    * seconds_to_mins
)
route2_time = (
    routing.route_to_gdf(G_cc, route2, weight="travel_time")["travel_time"].sum()
    * seconds_to_mins
)

Summarize:

Show Code
print(f"Route 1 is {route1_length:.2f} miles and takes {route1_time:.2f} minutes.")
print(f"Route 2 is {route2_length:.2f} miles and takes {route2_time:.2f} minutes.")
Route 1 is 2.19 miles and takes 5.18 minutes.
Route 2 is 2.46 miles and takes 4.57 minutes.

5 Part 2: Pandana

“Pandas Network Analysis - dataframes of network queries, quickly”

A complementary set of OSM-related features: - Downloading OSM-based networks - Extracting amenity data (so-called “Points of Interest”) - Calculating network-constrained distances

Show Code
# !pip install pandana
Show Code
import pandana as pnda
from pandana.loaders import osm

5.1 Step 1: Get amenity data

Key function: osm.node_query()

  • This will extract amenities within a given bounding box.
  • Similar to the ox.features_from_bbox() function in OSMnx, but we slightly different syntax.
Show Code
osm.node_query?
Signature: osm.node_query(lat_min, lng_min, lat_max, lng_max, tags=None)
Docstring:
Search for OSM nodes within a bounding box that match given tags.
Parameters
----------
lat_min, lng_min, lat_max, lng_max : float
tags : str or list of str, optional
    Node tags that will be used to filter the search.
    See http://wiki.openstreetmap.org/wiki/Overpass_API/Language_Guide
    for information about OSM Overpass queries
    and http://wiki.openstreetmap.org/wiki/Map_Features
    for a list of tags.
Returns
-------
nodes : pandas.DataFrame
    Will have 'lat' and 'lon' columns, plus other columns for the
    tags associated with the node (these will vary based on the query).
    Index will be the OSM node IDs.
File:      ~/mambaforge/envs/musa-550-fall-2023/lib/python3.10/site-packages/pandana/loaders/osm.py
Type:      function

Get the bounding box:

Show Code
boundary = center_city_outline.bounds
boundary, type(boundary)
((-75.1935824529863, 39.9286257450625, -75.1259307965394, 39.9738724134054),
 tuple)
Show Code
[lng_min, lat_min, lng_max, lat_max] = boundary
Show Code
# query OSM
poi_df = osm.node_query(lat_min, lng_min, lat_max, lng_max)

# remove missing data
poi_df = poi_df.dropna(subset=["amenity"])
Show Code
poi_df.head()
lat lon railway light_rail name network operator public_transport wheelchair highway traffic_signals direction old_ref ref noref crossing crossing:markings crossing:signals traffic_calming crossing:island tactile_paving stop noexit traffic_signals:direction kerb crossing:barrier amenity barrier disused:railway button_operated crossing:markings:colour traffic_signals:sound traffic_signals:vibration crossing_ref supervised railway:signal:direction ele gnis:feature_id place wikidata wikipedia alt_name name:en name:zh brand brand:wikidata operator:wikidata operator:wikipedia short_name addr:city addr:housenumber addr:postcode addr:state addr:street air_conditioning branch cuisine official_name opening_hours phone takeaway website shop ferry building atm contact:facebook diet:vegetarian payment:cash payment:credit_cards payment:debit_cards check_date check_date:opening_hours brand:website healthcare brewery contact:instagram diet:vegan email description historic:amenity note education old_name leisure sport man_made tower:type operator:short operator:type operator:website emergency healthcare:speciality railway:position train artwork_type historic tourism information artist_name material office bench bus covered network:wikidata shelter memorial addr:housename was:man_made comment historic:tourism disused:leisure was:name was:opening_hours was:sport addr:country platforms station subway junction iata railway:ref railway:switch:local_operated railway:signal:position bicycle segregated addr:unit internet_access internet_access:fee start_date subject:wikidata drive_through tram contact:website reservation website:menu contact:linkedin contact:tiktok contact:twitter studio delivery indoor_seating colour parking collection_times self_service check_date:kerb entrance screen outdoor_seating payment:coins smoking architect disused:amenity contact:phone network:wikipedia wikimedia_commons female dispensing landmark name:de capacity contact:myspace fax bar designation disused:shop service:bicycle:pump service:bicycle:repair service:bicycle:retail toilets:wheelchair route_ref source:pkey vacant fast_food fuel:propane power substation was:website access level fee museum bin lit mobile fuel:biodiesel fuel:biogas fuel:cng fuel:diesel fuel:e10 fuel:e85 fuel:electricity collection_times:signed ref:signed check_date:collection_times clothes addr:full check_date:diet:vegan image:menu image:menu:0 image:menu:1 image:menu:2 panoramax panoramax:0 beauty fair_trade organic fixme check_date:diet:vegetarian opening_hours:signed bicycle_rental kiosk min_age owner owner:wikidata ownership payment:app rental sponsor sponsor:wikidata opening_hours:bar opening_hours:kitchen phone:mnemonic disused:brand disused:brand:wikidata disused:brand:wikipedia disused:dispensing disused:drive_through disused:healthcare disused:opening_hours denomination religion diet:pescetarian lgbtq fare_zone toilets toilets:access power_supply building:levels population payment:apple_pay payment:cards payment:contactless second_hand disused:name farm_boxes addr:place social_facility source:cuisine demolished:amenity demolished:opening_hours demolished:phone demolished:social_facility maxheight artwork_subject inscription access:delivery wheelchair:description wheelchair:description:en was:cuisine internet_access:ssid elevation park_ride layer artist:wikidata height name:es service:bicycle:chain_tool natural name:fr statue cycleway:crossing:markings:colour name:signed surface departures_board subject:wikipedia was:tourism check_date:shelter denotation check_date:tactile_paving maxspeed facebook was:brand was:brand:wikidata check_date:wheelchair ref:isil currency:USD drink:coca-cola drink:coke drink:cola drink:cola_zero drink:soda drink:water vending foot locked motor_vehicle motorcar year_of_construction name:ru toilets:unisex kitchen_hours animal craft contact:email disused:cuisine website:orders website:reservation source:lgbtq horse bottle fountain lamp_type theatre:genre line_attachment microbrewery cycleway:left cycleway:oneway bicycle_parking ref:retrofitness leaf_cycle leaf_type capital loc_name name:ar name:azb name:be name:bn name:ca name:cay name:chr name:cs name:el name:fa name:grc name:he name:hi name:it name:ja name:kn name:ko name:lv name:moh name:oc name:ono name:pa name:pl name:pt name:sr name:ta name:te name:tr name:uk name:ur name:zh-Hans name:zh-Hant population:date source:name:oc source:population changing_table happy_hours opening_hours:brunch opening_hours:dinner opening_hours:lunch advertising payment:american_express payment:mastercard payment:visa backrest fire_hydrant:position fire_hydrant:type club playground date display faces bollard seats seamark:type was:alt_name was:takeaway country flag:name flag:type amenity_1 female:signed male:signed payment:venmo social_facility:for end_date species payment:notes camera:direction camera:mount camera:type surveillance surveillance:type manhole drink:beer recycling_type brand:type location type library disused:tourism authority marker_date historic:name baby parcel_locker:type parcel_mail_in consulate diplomatic target dog recycling:beverage_cartons recycling:cans recycling:glass_bottles recycling:paper recycling:plastic recycling:plastic_bottles recycling:plastic_packaging contact:yelp postal_code portable seasonal toilets:disposal toilets:handwashing toilets:position unisex particle_accelerator substance payment:cheque payment:discover_card heritage flag:wikidata subject flag:colour fixme:atp communication:mobile_phone post_office post_office:brand post_office:service_provider post_office:website demolished:noexit school dance:style dance:teaching waste landuse military_service generator:method generator:output:electricity generator:source generator:type check_date:capacity inscription:url payment:cash_app seating street_vendor gender hiking support twitter door smoothness contact:flickr contact:mastodon indoor name:etymology:wikidata rooms opening_hours:Condesa opening_hours:El_Cafe opening_hours:El_Techo was:amenity was:official_name cash_in service:bicycle:tools network:short image mimics source:url water_source class:bicycle drinking_water fridge male ramp:wheelchair attraction food generator:output:hot_water not:network:wikidata defibrillator:location brand:wikipedia bridge:support opening_hours:url cash_out currency:XBT payment:lightning payment:lightning_contactless payment:onchain fishing couplings government self_checkout flickr disused:payment:cash disused:payment:contactless disused:payment:credit_cards disused:payment:debit_cards disused:phone disused:ref delivery:partner internet_access:password surveillance:zone post_box:type fire_mains fire_sprinkler bonnet:colour lamp_mount openplaques:id description:en military memorial:website ref:hmdb disused:official_name disused:takeaway compressed_air service:bicycle:rental service:bicycle:sales service:bicycle:service addr:door community_centre:for community_centre cycleway name:etymology collector tidal waterway design structure voltage:primary cables switch location:transition street_cabinet noname role diet railway:signal_box railway_milepost maxwidth:physical source:maxwidth:physical books residential internet_access:operator contact:webcam monitoring:dissolved_oxygen monitoring:flow_rate monitoring:tide_gauge monitoring:water_conductivity monitoring:water_level monitoring:water_nitrate monitoring:water_nitrite monitoring:water_pH monitoring:water_temperature monitoring:water_turbidity monitoring:water_velocity shef:location_id website:1 ele:accuracy ele:datum monitoring:air_pressure monitoring:precipitation cafe contact:bluesky website:booking nursery preschool monitoring:air_gap monitoring:air_temperature website:2 armrest count diet:halal hairdresser sign removed:amenity product animal_training gender_segregated gate:type animal_boarding swimming_pool public_bookcase:type authentication:app brand:en frequency hgv maxstay network:website payment:app:tesla ref:supercharge_info scooter socket:nacs socket:nacs:output diet:mediterranean restaurant panoramax:1
id
110237774 39.950401 -75.156620 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN parking_entrance NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
274216093 39.957640 -75.191254 NaN NaN Citibank NaN Citibank NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN atm NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Citibank Q857063 Q857063 en:Citibank Citi NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
274217596 39.953015 -75.192289 NaN NaN Starbucks NaN NaN NaN NaN NaN NaN NaN NaN 14716 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN cafe NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN Starbucks Q37158 NaN NaN NaN Philadelphia 3401 19104 PA Walnut Street yes Walnut & 34th coffee_shop Starbucks Coffee Mo-Fr 05:30-20:00; Sa,Su 06:00-20:00 +1-215-387-1914 yes https://www.starbucks.com/store-locator/store/... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
313440966 39.963935 -75.166939 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN car_sharing NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
313440968 39.963978 -75.170407 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN car_sharing NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Show Code
len(poi_df)
2918
Show Code
poi_df[["lat", "lon", "amenity"]].head(10)
lat lon amenity
id
110237774 39.950401 -75.156620 parking_entrance
274216093 39.957640 -75.191254 atm
274217596 39.953015 -75.192289 cafe
313440966 39.963935 -75.166939 car_sharing
313440968 39.963978 -75.170407 car_sharing
326519551 39.944261 -75.132616 ferry_terminal
333786044 39.940858 -75.158928 restaurant
333786095 39.941924 -75.157357 cafe
333786448 39.942642 -75.157958 bank
333786774 39.943102 -75.160030 pharmacy

5.1.1 Explore the amenities in this region

For the full list of amenities, see the OSM Wikipedia

Show Code
import altair as alt  # Import Altair first

chart = (
    alt.Chart(poi_df)
    .mark_bar()
    .encode(y=alt.Y("amenity", sort="-x"), x="count()", tooltip=["amenity", "count()"])
)

chart

5.2 Step 2: Create a Pandana network

  • Key function: pdna_network_from_bbox()
  • It takes a bounding box and returns the OSM network within that region.
  • Multiple network types: ‘walk’ and ‘drive’
Show Code
# !pip install osmnet
Show Code
net = osm.pdna_network_from_bbox(
    lat_min, lng_min, lat_max, lng_max, network_type="walk"
)
Requesting network data within bounding box from Overpass API in 1 request(s)
Posting to http://www.overpass-api.de/api/interpreter with timeout=180, "{'data': '[out:json][timeout:180];(way["highway"]["highway"!~"motor|proposed|construction|abandoned|platform|raceway"]["foot"!~"no"]["pedestrians"!~"no"](39.92862575,-75.19358245,39.97387241,-75.12593080);>;);out;'}"
Downloaded 9,611.8KB from www.overpass-api.de in 1.70 seconds
Downloaded OSM network data within bounding box from Overpass API in 1 request(s) and 1.78 seconds
Returning OSM data with 47,353 nodes and 16,063 ways...
Edge node pairs completed. Took 3.65 seconds
Returning processed graph with 23,280 nodes and 34,607 edges...
Completed OSM data download and Pandana node and edge table creation in 5.75 seconds
Generating contraction hierarchies with 12 threads.
Setting CH node vector of size 23280
Setting CH edge vector of size 34819
Range graph removed 962 edges of 69638
. 10% . 20% . 30% . 40% . 50% . 60% . 70% . 80% . 90% . 100%

5.3 Step 3: Tell the network the location of amenities

Key function: network.set_pois()

  • Today, we’ll explore these four amenities: “restaurant”, “bar”, “school”, “car_sharing”
  • IMPORTANT: if you want to explore other amenities, you’ll need to run the code below for your amenities of interest
Show Code
# sensible defaults
max_distance = 2000  # in meters
num_pois = 10  # only need the 10 nearest POI to each point in the network


AMENITIES = ["restaurant", "bar", "school", "car_sharing"]
for amenity in AMENITIES:
    
    # get the subset of amenities for this type
    pois_subset = poi_df[poi_df["amenity"] == amenity]

    # set the POI, using the longitude and latitude of POI
    net.set_pois(
        amenity, max_distance, num_pois, pois_subset["lon"], pois_subset["lat"]
    )
Show Code
# keyword arguments to pass for the matplotlib figure
bbox_aspect_ratio = (lat_max - lat_min) / (lng_max - lng_min)
fig_kwargs = {"facecolor": "w", "figsize": (10, 10 * bbox_aspect_ratio)}

# keyword arguments to pass for scatter plots
plot_kwargs = {"s": 20, "alpha": 0.9, "cmap": "viridis_r", "edgecolor": "none"}

5.4 Step 4: Plot the walking distance to the nearest POI

For every point on the network, find the nth nearest POI, calculate the distance, and color that point according to the distance.

  1. Use network.nearest_poi() to get distances from nodes to nearest POIs
  2. Merge coordinates of network nodes with distances to nearest POIs
  3. Plot the node coordinates, colored by distance to nth nearest POI

5.4.1 4.1 Use network.nearest_poi() to get distances from nodes to nearest POIs

Show Code
amenity = "bar"
access = net.nearest_pois(distance=2000, category=amenity, num_pois=num_pois)
Show Code
access.tail(n=50)
1 2 3 4 5 6 7 8 9 10
id
13182269961 717.754028 797.986023 798.521973 819.250977 879.151978 879.151978 913.083008 930.245972 1043.822021 1074.119019
13182269962 715.526001 795.757996 796.294006 817.023010 876.924011 876.924011 910.854980 928.018005 1041.593994 1071.890991
13182269963 639.046997 719.278992 719.815002 787.351013 834.375977 847.252014 847.252014 851.539001 1009.510010 1011.921997
13185110764 555.495972 556.807007 581.218994 660.169983 759.638000 1224.302979 1570.853027 1570.853027 1670.656006 1673.364990
13185150353 618.801025 667.177002 799.289978 823.702026 877.908997 1310.864990 1310.864990 1545.333008 1659.536987 1748.035034
13188965453 970.898987 973.130981 1021.692993 1021.692993 1025.203003 1025.203003 1025.203003 1027.494995 1027.562988 1040.069946
13189450687 247.828003 247.828003 247.828003 257.351990 257.351990 315.462006 470.367004 614.218994 614.672974 614.672974
13189450688 267.666992 275.649994 275.649994 275.649994 285.174011 285.174011 439.645996 566.877991 566.877991 597.903992
13189450689 238.880997 304.436005 304.436005 304.436005 313.959991 313.959991 440.773010 538.091980 538.091980 593.317017
13189450690 150.197998 399.910004 399.910004 399.910004 409.433990 409.433990 449.408997 449.408997 528.952026 588.758972
13196052611 1389.840942 1462.015991 1483.050049 1569.027954 1614.215942 2000.000000 2000.000000 2000.000000 2000.000000 2000.000000
13196052631 1307.192017 1379.366943 1400.401001 1486.379028 1531.567017 1965.254028 1984.355957 1985.417969 1990.358032 2000.000000
13196052662 1401.397949 1473.572998 1494.607056 1580.584961 1625.772949 2000.000000 2000.000000 2000.000000 2000.000000 2000.000000
13196052663 1397.718018 1469.892944 1490.927002 1576.905029 1622.093018 2000.000000 2000.000000 2000.000000 2000.000000 2000.000000
13201395939 661.543030 773.054016 807.060974 874.156982 874.156982 999.392029 1023.804016 1058.182007 1132.390991 1155.079956
13201395943 568.125000 570.833984 573.552002 724.216003 734.685974 856.598999 999.080994 1025.614014 1036.464966 1058.163940
13201924141 619.643982 620.955017 645.367004 724.317993 823.786011 1288.451050 1451.743042 1558.567993 1558.567993 1561.933960
13204745772 589.252014 673.992004 708.164001 839.421021 1008.210999 1057.765015 1072.703003 1121.442017 1138.942017 1165.942993
13204805124 102.675003 323.924011 367.493988 389.760986 442.420990 525.090027 850.549011 872.304993 1240.192993 1240.192993
13205532745 512.918030 1186.786011 1263.447998 1366.609009 1396.180054 1633.758057 1645.795044 1702.282959 1761.506958 1786.610962
13205532747 531.039978 1168.663940 1271.324951 1374.485962 1404.057007 1627.672974 1641.635010 1710.160034 1769.384033 1794.488037
13205532749 535.077026 1175.527954 1278.188965 1381.349976 1410.921021 1634.536987 1648.499023 1717.024048 1776.248047 1801.352051
13205547936 661.739990 1301.647949 1412.270020 1502.897949 1545.001953 1584.875977 1782.579956 1851.104980 1910.328979 1935.432983
13205547937 651.288025 1294.151001 1401.817993 1495.401001 1534.550049 1577.379028 1772.128052 1840.652954 1899.876953 1924.980957
13205547938 688.554993 1301.067993 1416.339966 1502.317993 1547.505981 1584.296021 1809.395020 1877.920044 1937.144043 1962.248047
13205547942 696.281982 1293.340942 1408.613037 1494.590942 1539.779053 1576.568970 1817.121948 1885.646973 1944.870972 1969.974976
13205547943 700.963989 1288.659058 1403.931030 1489.909058 1535.097046 1571.886963 1821.803955 1890.328979 1949.552979 1974.656982
13226691924 415.208008 465.820007 484.358002 509.915009 528.098022 748.646973 797.541992 838.416016 843.784973 853.669006
13235356796 394.610992 409.925995 482.980011 513.086975 653.294006 653.580017 656.377014 678.398010 875.046997 907.653992
13235356797 395.428009 410.743011 488.182007 513.903992 658.495972 658.781982 661.578979 683.599976 869.844971 912.856018
13235356799 446.596985 461.911987 540.465027 565.072998 710.666992 710.778992 713.817993 735.882996 817.562012 964.741028
13235356800 424.931000 440.246002 538.210022 543.406982 708.523987 726.731018 727.793030 733.627991 807.356018 980.804993
13235382101 444.585999 459.901001 538.453979 563.062012 708.656006 708.768005 711.807007 733.872009 819.572998 962.729980
13235382102 569.057983 583.526978 584.372986 586.677979 657.427002 668.622986 687.533997 693.726990 837.601013 886.364014
13235382103 586.302002 600.260010 601.617004 603.414978 677.843018 686.039978 704.778015 711.143982 854.333984 867.211975
13235382104 502.946014 518.260986 596.814026 621.421997 681.263000 684.414001 766.359009 791.463013 846.065979 935.336975
13235382105 583.898987 599.213989 601.539978 604.690979 675.440002 686.635986 702.375000 711.739990 855.614014 869.614990
13235382106 590.648010 593.802979 596.484009 611.799011 683.739990 684.195984 709.299988 714.960022 844.721985 868.002014
13235382107 577.327026 580.481995 583.148987 598.463989 670.405029 670.861023 695.965027 701.625000 831.401001 881.336975
13235382108 573.914978 577.070007 579.737000 595.052002 666.992981 667.448975 692.552979 698.213013 827.989014 882.570984
13235382109 521.614014 524.768982 529.440002 544.755005 616.695984 617.151978 642.255981 647.916016 775.687988 934.872009
13235382110 520.020996 534.489990 535.335999 537.640991 608.390015 619.585999 638.497009 644.690002 788.564026 935.401001
13235382111 513.637024 528.952026 529.434021 532.231018 602.005981 614.176025 632.112976 639.280029 783.507996 941.784973
13235382112 516.440979 519.237976 523.552979 538.867981 610.809021 611.265015 636.369019 642.028992 770.515015 940.758972
13235382113 473.123993 488.438995 490.675995 493.472992 561.492981 575.418030 591.599976 600.521973 744.750000 981.429993
13235382114 508.350006 523.664978 524.146973 526.943970 596.718994 608.888977 626.825989 633.992981 778.221008 946.856995
13235382116 480.294006 483.091003 483.506012 498.821014 570.762024 571.218018 596.322021 601.981995 734.367981 977.229980
13235382117 480.415009 483.385010 486.182007 495.730011 567.671021 568.127014 593.231018 598.890991 737.458984 974.138977
13235382118 474.484009 477.281006 489.316010 504.631012 575.052002 575.507996 600.612000 607.791992 728.557983 982.716003
13235382121 478.343994 481.140991 485.455994 500.770996 572.711975 573.168030 598.271973 603.932007 732.418030 978.856018

5.4.2 4.2 Merge coordinates of network nodes with distances to nearest POIs

Show Code
net.nodes_df.head()
x y
id
103327043 -75.128666 39.934488
103332711 -75.128062 39.939224
103332730 -75.129329 39.941869
103333406 -75.130240 39.943351
103333412 -75.130346 39.943130
Show Code
access.head()
1 2 3 4 5 6 7 8 9 10
id
103327043 1752.093018 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0
103332711 988.283020 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0
103332730 670.846008 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0
103333406 597.504028 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0
103333412 630.221008 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0
Show Code
import pandas as pd

# Merge the nodes and the distance to POIs
nodes = pd.merge(net.nodes_df, access, left_index=True, right_index=True)

# Make into a geodataframe
nodes = gpd.GeoDataFrame(
    nodes, geometry=gpd.points_from_xy(nodes["x"], nodes["y"]), crs="EPSG:4326"
)
Show Code
nodes.head()
x y 1 2 3 4 5 6 7 8 9 10 geometry
id
103327043 -75.128666 39.934488 1752.093018 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 POINT (-75.12867 39.93449)
103332711 -75.128062 39.939224 988.283020 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 POINT (-75.12806 39.93922)
103332730 -75.129329 39.941869 670.846008 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 POINT (-75.12933 39.94187)
103333406 -75.130240 39.943351 597.504028 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 POINT (-75.13024 39.94335)
103333412 -75.130346 39.943130 630.221008 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 2000.0 POINT (-75.13035 39.94313)

5.4.3 4.3 And now plot it!

Let’s define a function to do this for us, since we’ll repeat this plot multiple times

Show Code
def plot_walking_distance(net, amenity, distance=1000, n=1):
    """
    Plot the walking distance to the specified amenity
    """
    from mpl_toolkits.axes_grid1 import make_axes_locatable

    # subset of POI
    poi_subset = poi_df[poi_df["amenity"] == amenity]

    # get the distances to nearest num_pois POI
    access = net.nearest_pois(distance=1000, category=amenity, num_pois=num_pois)

    # merge node positions and distances to nearest PO
    nodes = pd.merge(net.nodes_df, access, left_index=True, right_index=True)
    nodes = gpd.GeoDataFrame(
        nodes, geometry=gpd.points_from_xy(nodes["x"], nodes["y"]), crs="EPSG:4326"
    )

    # Create the figure
    fig, ax = plt.subplots(figsize=(10, 10))
    divider = make_axes_locatable(ax)
    cax = divider.append_axes("right", size="5%", pad=0.1)

    # plot the distance to the nth nearest amenity
    ax = nodes.plot(ax=ax, cax=cax, column=nodes[n], legend=True, **plot_kwargs)

    # add the amenities as stars
    for i, row in poi_subset.iterrows():
        ax.scatter(row["lon"], row["lat"], color="red", s=100, marker="*")

    # format
    ax.set_facecolor("black")
    ax.figure.set_size_inches(fig_kwargs["figsize"])

    # set extent
    [xmin, ymin, xmax, ymax] = nodes.geometry.total_bounds
    ax.set_xlim(xmin, xmax)
    ax.set_ylim(ymin, ymax)

    return ax

5.5 Evaluating amenity choice

The difference between maps to the nearest amenity and for example, the 5th nearest amenity tells us about the options consumers have

5.5.1 Example: bars

Show Code
ax = plot_walking_distance(net, "bar", n=1)
ax.set_title("Walking distance to the nearest bar", fontsize=18);

Show Code
ax = plot_walking_distance(net, "bar", n=3)
ax.set_title("Walking distance to the 3rd nearest bar", fontsize=18);

5.5.2 Example: schools

Show Code
ax = plot_walking_distance(net, "school", n=1)
ax.set_title("Walking distance to the nearest school", fontsize=18);

Show Code
ax = plot_walking_distance(net, "school", n=3)
ax.set_title("Walking distance to the 3rd nearest school", fontsize=18);

5.5.3 Example: restaurants

Show Code
ax = plot_walking_distance(net, "restaurant", n=1)
ax.set_title("Walking distance to the nearest restaurant", fontsize=18);

Show Code
ax = plot_walking_distance(net, "restaurant", n=10)
ax.set_title("Walking distance to the 10th nearest restaurant", fontsize=18);

5.5.4 Example: car sharing

Show Code
ax = plot_walking_distance(net, "car_sharing", n=1)
ax.set_title("Walking distance to the nearest car sharing", fontsize=18);

Show Code
ax = plot_walking_distance(net, "car_sharing", n=10)
ax.set_title("Walking distance to the 10th nearest car sharing", fontsize=18);

6 At-home exercise: Explore amenities in the neighborhood of your choice

Many, many more amenities are logged throughout the city. Pick your favorite neighborhood and explore.

See this page for the full list of amenities.

Final project idea: With this kind of analysis, you can look at amenity-based influence in housing, neighborhood selection, etc. or something similar to the Walk Score.